package priv.wangy.micro.common.utils.file.impl;

import org.apache.commons.io.FilenameUtils;
import org.springframework.web.multipart.MultipartFile;
import priv.wangy.micro.common.utils.file.FileType;
import priv.wangy.micro.common.utils.file.IFileTypeUtil;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Objects;

/**
 * 图片类型文件工厂
 *
 * @author 张嘉琪
 * @since 2023-04-24
 */
public class ImgTypeUtil extends BaseTypeUtil {

    private static final IFileTypeUtil INSTANCE = new ImgTypeUtil();

    @Override
    public boolean typeVerify(MultipartFile file) {
        try {
            if (chkFileVerify(file)) {
                /*
                判断文件扩展名是否为常见图片类型
                 */
                String extension = FilenameUtils.getExtension(file.getOriginalFilename());
                FileType type = FileType.getImgByExtension(extension);
                if (Objects.isNull(type)) {
                    return false;
                }
                /*
                判断文件魔术数字是否与文件扩展名匹配
                 */
                if (chkMagicNumber(file, type)) {
                    return false;
                }
                return advancedTypeVerify(file);
            }
            return false;
        } catch (IOException e) {
            return false;
        }
    }

    @Override
    public boolean advancedTypeVerify(MultipartFile file) {
        try {
            /*
            判断图片文件是否包含长、宽等基础属性
             */
            BufferedImage bi = ImageIO.read(file.getInputStream());
            return bi.getWidth() > 0 && bi.getHeight() > 0;
        } catch (IOException e) {
            return false;
        }
    }

    public static IFileTypeUtil getInstance() {
        return INSTANCE;
    }
}
